package com.gandong8.es.tool.domain;

import lombok.Getter;

/**
 * Elasticsearch 数据类型
 * https://www.elastic.co/guide/en/elasticsearch/reference/6.5/mapping-types.html
 *
 */
public enum EsDataType {


    /**
     * 适用于索引结构化的字段,字段需要进行过滤、排序、聚合。只能通过精确值搜索到
     */
    KEYWORD("keyword"),
    /**
     * string数据put到elasticsearch中，默认是text.
     * text是要被分词的，整个字符串根据一定规则分解成一个个小写的term,text类型的字段不用于排序，很少用于聚合。
     * Elasticsearch 5.X 之后给 text 类型的分词字段，又默认新增了一个子字段 keyword，这个字段的类型就是 keyword，是不分词的，默认保留 256 个字符
     * ES允许同一个字段有两个不同的类型，一个字段可以拥有keyword类型来进行聚合与排序，也可以拥有text来做全文检索
     *   如:{"content":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256},"english":{"type":"text","analyzer":english}}}}
     */
    TEXT("text"),
    /**
     * 范围:-128~127
     */
    BYTE("byte"),
    /**
     * 范围:-32,768~32,767
     */
    SHORT("short"),
    /**
     * 范围:-2^31~2^31-1
     */
    INTEGER("integer"),
    /**
     * 范围:-2^63~2^63-1
     */
    LONG("long"),
    /**
     * 32位单精度IEEE 754浮点类型
     */
    FLOAT("float"),
    /**
     * 64位双精度IEEE 754浮点类型
     */
    DOUBLE("double"),
    /**
     * 16位半精度IEEE 754浮点类型
     */
    HALF_FLOAT("half_float"),
    /**
     * 缩放类型的的浮点数
     */
    SCALED_FLOAT("scaled_float"),
    /**
     * 日期格式;long类型的毫秒数;integer的秒数
     */
    DATE("date"),
    /**
     * "true,false"
     */
    BOOLEAN("boolean"),
    /**
     * 数组类型不需要专门指定数组元素的类型，任何字段类型都可以包含在数组内，但是数组中的所有值必须具有相同的数据类型。
     */
    //ARRAY("array", "[1,2]"),
    /**
     * for single JSON objects
     */
    OBJECT("object"),
    /**
     * for arrays of JSON objects
     */
    NESTED("nested");

    @Getter
    private String type;

    EsDataType(String type) {
        this.type = type;
    }
}
